package com.ys.p5Stack栈;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 描述:
 *1.栈的概述
 *   生活中，我们也经常遇到栈这种数据结构，例如：叠盘子、子弹夹
 *   编程中，栈内存就符合栈的特点，算数运算也符合栈的特点。
 * 2.栈的特点
 *   先进后出（FILO，First In Last Out），我们也称之为FILO表。
 * 3.Java提供的栈
 *   在java中，有提供Stack的接口，用于实现栈，不过该接口已经弃用了。
 *   目前，如果需要使用栈，那么应该使用Deque的接口来实现，Deque的接口的实现类是LinkedList类。
 * 4.Deque接口中的方法
 *   void push(E e);	入栈，在头部添加元素，栈的空间可能是有限的，如果栈满了，会抛出异常。
 *   E pop();	        出栈，返回头部元素，并且从栈中删除，如果栈为空，会抛出异常。
 *   E peek();	        查看栈头部元素，不修改栈，如果栈为空，返回null。 
 *   boolean isEmpty();	判断栈是否为空，如果为空则返回true；否则返回false。
 *
 * 5.栈的模拟实现
 *   a)使用数组模拟实现栈
 *   b)使用单链表模拟实现栈
 *
 * 6:在Java里有stack的实现类 Deque
 *
 * 总结: LinkedList底层是一个双向链表,可以是队列,栈的实现类
 * @author CodeYang
 * @version 2021/1/4 0:45
 */
public class p1Stack的了解与使用 {

    public static void main(String[] args) {
        // 创建一个 栈对象 ,此处的stack实际类型是 LinkedList
        // Deque 就是改造了Queue 也就是使用 双向链表的特殊规则来实现 Stack的特殊数据结构特点: FILO 先进后出
        Deque<String> stack = new LinkedList<>();
        // 压栈操作,入栈
        stack.push("1");
        stack.push("2");
        stack.push("3");
        stack.push("4"); // 栈顶
        // 查看栈顶元素
        System.out.println("栈顶:"+stack.peek());
        //遍历栈中元素,出栈
        while (!stack.isEmpty()){
            //弹栈
            System.out.println(stack.pop());
        }
    }
}
